package com.centriole.service.exuser.service;

import com.centriole.common.utils.PaasResult;
import com.centriole.common.entity.ExRole;
import com.centriole.common.entity.ExUser;
import com.centriole.common.entity.Page;

import java.util.List;

/**
 *  功   能： ExUserService 统一用户管理Service
 *  创建人：陈默晗
 *  时   间：2018年4月11日上午9:18:46
 */
public interface ExUserService {

    /**
     * 添加 (对外使用的)用户
     * @param user  ExUser对象
     * @return  true表示添加成功；false表示添加失败
     */
    boolean addExUser(ExUser user);

    /**
     * 根据UserId 逻辑删除(对外使用的)用户
     * @param userId    String(32位UUID)
     * @return  true表示添加成功；false表示添加失败
     */
    boolean removeExUser(String userId);

    /**
     * 修改(对外使用的)用户信息
     * @param user
     * @return true表示添加成功；false表示添加失败
     */
    boolean modifyExUser(ExUser user);

    /**
     * 查询所有(对外使用的)用户
     * @return
     */
    List<ExUser> listAllExUsers();

    /**
     * 查询所有权限
     * @return
     */
   // List<ExPermission> listAllPermissions();

    /**
     * 指定用户Id(32位UUID)来查询用户
     * @param userId    String 32位UUID
     * @return  ExUser对象
     */
    ExUser findExUserByUserId(String userId);

    /**
     * 指定账号名来查询用户
     * @param accountName    账号名
     * @return  ExUser对象
     */
    ExUser findExUserByAccountName(String accountName);

    /**
     * 指定 角色id 来查询相关的用户
     * @param roleId    String 32位UUID
     * @return  List<ExUser>
     */
    List<ExUser> listExUsersByRoleId(String roleId);

    /**
     * 指定 角色名 来查询相关的用户
     * @param roleName    String  角色名
     * @return  List<ExUser>
     */
    List<ExUser> listExUsersByRoleName(String roleName);

    /**
     * 指定 权限id 来查询相关的用户
     * @param permissionId  String 32位UUID
     * @return  List<ExUser>
     */
    List<ExUser> selectByPermissionId(String permissionId);

    /**
     * 指定 权限名 来查询相关的用户
     * @param permissionName  权限名
     * @return  List<ExUser>
     */
    List<ExUser> selectByPermissionName(String permissionName);

    /**
     * 给指定用户关联角色
     * @param userId                String 32位UUID
     * @param roleIds  至少1个roleIds String 32位UUID
     * @return  true表示添加成功；false表示添加失败
     */
    boolean relateUserAndRole(String userId, String... roleIds);

    /**
     * 给指定角色关联权限
     * @param roleId                String 32位UUID
     * @param permissionIds  至少1个PermissionId String 32位UUID
     * @return  true表示关联成功；false表示关联失败
     */
    boolean relateRoleAndPermission(String roleId, String... permissionIds);

    /**
     * 关联查询出 (对外使用的)用户信息(包含该用户的基本信息、拥有角色、拥有权限)
     * @return  List<ExUser>(包含该用户的基本信息、拥有角色、拥有权限)
     */
    List<ExUser> listRAllExUsers(Page page);

    /**
     * 关联查询出 所有角色(还包含了所属权限)
     * @return  List<ExRole>(包含该角色的基本信息、拥有权限)
     */
    List<ExRole> listRAllRoles();

    /**
     * 根据UserId 关联查询出用户(包含该用户的基本信息、拥有角色、拥有权限)
     * @param userId    String 32位UUID
     * @return  ExUser对象(包含该用户的基本信息、拥有角色、拥有权限)
     */
    ExUser findRByUserId(String userId);

    /**
     *  用户登录，注册或者登录成功后返回一个token
     *
     * @param exUser    exUser对象
     * @return  String token
     */
    PaasResult login(ExUser exUser , String ip);

    /*
     *  指定用户id,清除该用户的token,token存在则表示 登录状态
     * @param userId     用户id
     * @return  String token
     */
    boolean logout(String userId);

}
